package com.shoy.myapp.common.task;

import android.content.Context;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.ResponseHandlerInterface;
import com.shoy.myapp.app.AppManager;
import com.shoy.myapp.common.Utils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Map;

/**
 * Http Task
 *
 * @created on 2015/4/22.
 */
public abstract class HttpTask {
    /**
     * 异步的HTTP客户端实例*
     */
    protected static AsyncHttpClient client = new AsyncHttpClient();

    /**
     * 默认字符集*
     */
    public static String DEFAULT_CHARSET = "UTF-8";

    /**
     * 模拟GET表单（无参数）
     *
     * @param url             请求URL
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void get(String url, ResponseHandlerInterface responseHandler) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            client.get(url, responseHandler);
        }
    }

    /**
     * 模拟GET表单（有参数）
     *
     * @param url             请求URL
     * @param paramsMap       参数
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void get(String url, Map<String, ?> paramsMap, ResponseHandlerInterface responseHandler, String... charset) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            if (null != charset && charset.length > 0) {
                DEFAULT_CHARSET = charset[0];
            }
            client.get(url, fillParams(paramsMap, DEFAULT_CHARSET), responseHandler);
        }
    }

    /**
     * 模拟GET表单（有参数）
     *
     * @param context         上下文
     * @param url             请求URL
     * @param paramsMap       参数
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void get(Context context, String url, Map<String, ?> paramsMap, ResponseHandlerInterface responseHandler, String... charset) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            if (null != charset && charset.length > 0) {
                DEFAULT_CHARSET = charset[0];
            }
            client.get(context, url, fillParams(paramsMap, DEFAULT_CHARSET), responseHandler);
        }
    }

    /**
     * 模拟POST表单（无参数）
     *
     * @param url             请求URL
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void post(String url, ResponseHandlerInterface responseHandler) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            client.post(url, responseHandler);
        }
    }

    /**
     * 模拟POST表单（有参数）
     *
     * @param url             请求URL
     * @param paramsMap       参数
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void post(String url, Map<String, ?> paramsMap, ResponseHandlerInterface responseHandler, String... charset) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            if (null != charset && charset.length > 0) {
                DEFAULT_CHARSET = charset[0];
            }
            client.post(url, fillParams(paramsMap, DEFAULT_CHARSET), responseHandler);
        }
    }

    /**
     * 模拟POST表单（有参数）
     *
     * @param context         上下文
     * @param url             请求URL
     * @param paramsMap       参数
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void post(Context context, String url, Map<String, ?> paramsMap, ResponseHandlerInterface responseHandler, String... charset) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            if (null != charset && charset.length > 0) {
                DEFAULT_CHARSET = charset[0];
            }
            client.post(context, url, fillParams(paramsMap, DEFAULT_CHARSET), responseHandler);
        }
    }

    /**
     * 模拟提交POST表单（无参数）
     *
     * @param context         上下文
     * @param url             请求URL
     * @param entity          请求实体,可以null
     * @param contentType     表单contentType （"multipart/form-data"）
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void post(Context context, String url, HttpEntity entity, String contentType, ResponseHandlerInterface responseHandler) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            client.post(context, url, entity, contentType, responseHandler);
        }
    }

    /**
     * 模拟提交POST表单（有参数）
     *
     * @param context         上下文
     * @param url             请求URL
     * @param headers         请求Header
     * @param paramsMap       参数
     * @param contentType     表单contentType （"multipart/form-data"）
     * @param responseHandler 回调Handler（BinaryHandler/JSONHandler/JSONArrayHandler/TextHttpResponseHandler）
     */
    public static void post(Context context, String url, Header[] headers, Map<String, ?> paramsMap, String contentType, ResponseHandlerInterface responseHandler, String... charset) {
        if (checkNetwork()) {
            //关闭过期连接.
            client.getHttpClient().getConnectionManager().closeExpiredConnections();
            if (null != charset && charset.length > 0) {
                DEFAULT_CHARSET = charset[0];
            }
            client.post(context, url, headers, fillParams(paramsMap, DEFAULT_CHARSET), contentType, responseHandler);
        }
    }

    /**
     * 装填参数
     *
     * @param map 参数
     * @return
     */
    public static RequestParams fillParams(Map<String, ?> map, String charset) {
        RequestParams params = new RequestParams();
        if (null != map && map.entrySet().size() > 0) {
            //设置字符集,防止参数提交乱码
            if (!"".equals(charset)) {
                params.setContentEncoding(charset);
            }
            for (Map.Entry<String, ?> stringEntry : map.entrySet()) {
                Map.Entry entity = (Map.Entry) stringEntry;
                Object key = entity.getKey();
                Object value = entity.getValue();
                if (value instanceof File) {
                    try {
                        params.put((String) key, new FileInputStream((File) value), ((File) value).getName());
                    } catch (FileNotFoundException e) {
                        throw new RuntimeException("文件不存在！", e);
                    }
                } else if (value instanceof InputStream) {
                    params.put((String) key, (InputStream) value);
                } else {
                    params.put((String) key, value.toString());
                }
            }
        }
        return params;
    }

    /**
     * 检测网络状态
     *
     * @return 网络是否连接
     */
    public static boolean checkNetwork() {
        Context context = AppManager.getInstance().current();
        boolean isConnected = Utils.isConnected(context);
        if (isConnected) {
            return true;
        } else {
            Utils.showToast("网络连接失败", context);
            return false;
        }
    }

    /**
     * 停止请求
     *
     * @param mContext 发起请求的上下文
     */
    public static void stopRequest(Context mContext) {
        client.cancelRequests(mContext, true);
    }

    /**
     * 停止全部请求
     */
    public static void stopAllRequest() {
        client.cancelAllRequests(true);
    }
}
